백준 2579 계단 오르기는 전형적인 dp 문제이다. 이 문제에서의 조건은 돌을 올라가는데 연속 3개의 계단을 밟을 수 없고 계단을 오를때는 1점프 혹은 2점프밖에 할 수 없다는 것이다. 그리고 마지막 계단에 왔을 때 밟아온 계단의 점수를 최대화 하는 것이 문제이다.
 이 문제의 핵심은 연속 3개의 계단을 밟을 수 없다는 것이다. 즉 1 2 3 4 라는 계단이 있을 때 4라는 계단에 도달하기 위해서는
1 -> 3 -> 4 (이전 계단을 밟았을 경우 연속 3개를 밟지 못하므로 무조건 2점프를 뛰어야한다)
2-> 4 (이전 계단을 밟지 않았을 경우 조건에 상관없이 2계단 전까지의 최대합을 더해주면 된다.)
즉 dp [i] = max( dp[i-2] + arr[i], dp[i-3] + arr[i-1]+ arr[i] )라는 점화식으로 최대값을 구할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #pragma  warning (disable:4996) #include  <cstdio>  #include  <vector>  #include  <string.h>  #define  INF 987654321 using  namespace  std ;int  n;int  arr[301 ];int  dp[301 ];int  max (int  a, int  b) 	return  a > b ? a : b; } int  main (int  argc, char * argv[])  	 	scanf ("%d" , &n); 	for  (int  i = 1 ; i <= n; i++) 		scanf ("%d" , &arr[i]); 	for  (int  i = 1 ; i <= n; i++) 	{ 		if  (i == 1 ) 			dp[1 ] = arr[1 ]; 		if  (i == 2 ) 			dp[2 ] = arr[1 ]+arr[2 ]; 		if  (i >= 3 ) 			dp[i] = max(dp[i - 2 ] + arr[i], dp[i - 3 ] + arr[i-1 ] + arr[i]); 	} 	printf ("%d\n" , dp[n]); 	return  0 ; }